package org.cis.jproyinv.comun.modelo;

import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.EnumType;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import java.util.Date;

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Persona implements Serializable {

    private String apellidos;
    private String e_mail;
    @Temporal(TemporalType.DATE)
    private Date fechaNacimiento;
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;
    private String nombres;
    private String numeroDocumentoIdentificacion;
    @Enumerated(EnumType.STRING)
    private TipoDocumentoIdentificacion m_TipoDocumentoIdentificacion;
    @Enumerated(EnumType.STRING)
    private EstadoCivil m_EstadoCivil;
    @Enumerated(EnumType.STRING)
    private TipoGenero m_TipoGenero;
    @OneToOne(cascade = CascadeType.ALL)
    private Direccion direccion;

    public Persona() {
    }

    public Persona(String apellidos, String e_mail, Date fechaNacimiento, String nombres, String numeroDocumentoIdentificacion, TipoDocumentoIdentificacion m_TipoDocumentoIdentificacion, EstadoCivil m_EstadoCivil, TipoGenero m_TipoGenero) {
        this.apellidos = apellidos;
        this.e_mail = e_mail;
        this.fechaNacimiento = fechaNacimiento;
        this.nombres = nombres;
        this.numeroDocumentoIdentificacion = numeroDocumentoIdentificacion;
        this.m_TipoDocumentoIdentificacion = m_TipoDocumentoIdentificacion;
        this.m_EstadoCivil = m_EstadoCivil;
        this.m_TipoGenero = m_TipoGenero;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public Direccion getDireccion() {
        return direccion;
    }

    public void setDireccion(Direccion direccion) {
        this.direccion = direccion;
    }

    public String getE_mail() {
        return e_mail;
    }

    public void setE_mail(String e_mail) {
        this.e_mail = e_mail;
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public EstadoCivil getM_EstadoCivil() {
        return m_EstadoCivil;
    }

    public void setM_EstadoCivil(EstadoCivil m_EstadoCivil) {
        this.m_EstadoCivil = m_EstadoCivil;
    }

    public TipoDocumentoIdentificacion getM_TipoDocumentoIdentificacion() {
        return m_TipoDocumentoIdentificacion;
    }

    public void setM_TipoDocumentoIdentificacion(TipoDocumentoIdentificacion m_TipoDocumentoIdentificacion) {
        this.m_TipoDocumentoIdentificacion = m_TipoDocumentoIdentificacion;
    }

    public TipoGenero getM_TipoGenero() {
        return m_TipoGenero;
    }

    public void setM_TipoGenero(TipoGenero m_TipoGenero) {
        this.m_TipoGenero = m_TipoGenero;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public String getNumeroDocumentoIdentificacion() {
        return numeroDocumentoIdentificacion;
    }

    public void setNumeroDocumentoIdentificacion(String numeroDocumentoIdentificacion) {
        this.numeroDocumentoIdentificacion = numeroDocumentoIdentificacion;
    }

    @Override
    public String toString() {
        return this.getNombres();
    }

    public boolean validarDNI() {
        String dni = this.getNumeroDocumentoIdentificacion();
        int decu[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
        int total = 0;
        if (dni.length() == 10) {
            for (int j = 0; j <= 9; j++) {
                decu[j] = (dni.charAt(j));
                switch (decu[j]) {
                    case 48:
                        decu[j] = 0;
                        break;
                    case 49:
                        decu[j] = 1;
                        break;
                    case 50:
                        decu[j] = 2;
                        break;
                    case 51:
                        decu[j] = 3;
                        break;
                    case 52:
                        decu[j] = 4;
                        break;
                    case 53:
                        decu[j] = 5;
                        break;
                    case 54:
                        decu[j] = 6;
                        break;
                    case 55:
                        decu[j] = 7;
                        break;
                    case 56:
                        decu[j] = 8;
                        break;
                    case 57:
                        decu[j] = 9;
                        break;
                }
            }

            int numPro = (decu[0] * 10) + decu[1];
            if ((numPro >= 1 & numPro <= 24) & (decu[2] >= 0 & decu[2] < 6)) {
                for (int i = 0; i <= 8; i++) {
                    if (i % 2 == 0) {
                        decu[i] = decu[i] * 2;
                        if (decu[i] > 9) {
                            decu[i] = decu[i] - 9;
                        }
                    }
                    total = total + decu[i];
                }
                double decProxima = total / 10;
                decProxima = (decProxima + 1) * 10;
                double verifica = decProxima - total;
                if ((verifica == decu[9]) || (verifica == 10 & decu[9] == 0)) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
}